// RAP [rh] Keys completely disabled as not implemented in RWT
///*******************************************************************************
// * Copyright (c) 2007, 2008 IBM Corporation and others.
// * All rights reserved. This program and the accompanying materials
// * are made available under the terms of the Eclipse Public License v1.0
// * which accompanies this distribution, and is available at
// * http://www.eclipse.org/legal/epl-v10.html
// *
// * Contributors:
// * IBM Corporation - initial API and implementation
// *******************************************************************************/
//
//package org.eclipse.ui.internal.keys.model;
//
//import java.util.ArrayList;
//import java.util.Collection;
//import java.util.HashMap;
//import java.util.Iterator;
//import java.util.Map;
//
//import org.eclipse.jface.bindings.Binding;
//import org.eclipse.jface.bindings.BindingManager;
//import org.eclipse.jface.bindings.TriggerSequence;
//import org.eclipse.jface.util.IPropertyChangeListener;
//import org.eclipse.jface.util.PropertyChangeEvent;
//
///**
// * @since 3.4
// *
// */
//public class ConflictModel extends CommonModel {
//
// public static final String PROP_CONFLICTS = "conflicts"; //$NON-NLS-1$
// public static final String PROP_CONFLICTS_ADD = "conflictsAdd"; //$NON-NLS-1$
// public static final String PROP_CONFLICTS_REMOVE = "conflictsRemove"; //$NON-NLS-1$
//
// /**
// * The set of conflicts for the currently selected element.
// */
// private Collection conflicts;
//
// private BindingManager bindingManager;
//
// private BindingModel bindingModel;
//
// /**
// * A mapping of binding element to known conflicts.
// */
// private Map conflictsMap;
//
// /**
// * @param kc
// */
// public ConflictModel(KeyController kc) {
// super(kc);
// }
//
// /**
// * @return Returns the conflicts.
// */
// public Collection getConflicts() {
// return conflicts;
// }
//
// /**
// * Sets the conflicts to the given collection. Any conflicts in the
// * collection that do not exist in the <code>bindingModel</code> are
// * removed.
// *
// * @param conflicts
// * The conflicts to set.
// */
// public void setConflicts(Collection conflicts) {
// Object old = this.conflicts;
// this.conflicts = conflicts;
//
// if (this.conflicts != null) {
// Iterator i = this.conflicts.iterator();
// Map bindingToElement = bindingModel.getBindingToElement();
// while (i.hasNext()) {
// Object next = i.next();
// if (!bindingToElement.containsValue(next)
// && !next.equals(getSelectedElement())) {
// i.remove();
// }
// }
// }
//
// controller.firePropertyChange(this, PROP_CONFLICTS, old, conflicts);
// }
//
// public void updateConflictsFor(BindingElement source) {
// updateConflictsFor(source, false);
// }
//
// public void updateConflictsFor(BindingElement oldValue,
// BindingElement newValue) {
// updateConflictsFor(oldValue, newValue, false);
// }
//
// public void updateConflictsFor(BindingElement source, boolean removal) {
// updateConflictsFor(null, source, removal);
// }
//
// private void updateConflictsFor(BindingElement oldValue,
// BindingElement newValue, boolean removal) {
// updateConflictsFor(newValue, oldValue == null ? null : oldValue
// .getTrigger(), newValue == null ? null : newValue.getTrigger(),
// removal);
// }
//
// public void updateConflictsFor(BindingElement newValue,
// TriggerSequence oldTrigger, TriggerSequence newTrigger,
// boolean removal) {
// Collection matches = (Collection) conflictsMap.get(newValue);
// if (matches != null) {
// if (newTrigger == null || removal) {
// // we need to clear this match
// matches.remove(newValue);
// conflictsMap.remove(newValue);
// if (matches == conflicts) {
// controller.firePropertyChange(this, PROP_CONFLICTS_REMOVE,
// null, newValue);
// }
// if (matches.size() == 1) {
// BindingElement tbe = (BindingElement) matches.iterator()
// .next();
// conflictsMap.remove(tbe);
// tbe.setConflict(Boolean.FALSE);
// if (matches == conflicts) {
// setConflicts(null);
// }
// }
// return;
// } else if (oldTrigger != null && !newTrigger.equals(oldTrigger)) {
// // we need to clear this match
// matches.remove(newValue);
// conflictsMap.remove(newValue);
//
// if (matches == conflicts) {
// controller.firePropertyChange(this, PROP_CONFLICTS_REMOVE,
// null, newValue);
// }
// if (matches.size() == 1) {
// BindingElement tbe = (BindingElement) matches.iterator()
// .next();
// conflictsMap.remove(tbe);
// tbe.setConflict(Boolean.FALSE);
// if (matches == conflicts) {
// setConflicts(null);
// }
// }
// } else {
// return;
// }
// }
//
// if (newValue.getTrigger() == null
// || !(newValue.getModelObject() instanceof Binding)) {
// return;
// }
// Binding binding = (Binding) newValue.getModelObject();
// TriggerSequence trigger = binding.getTriggerSequence();
//
// matches = (Collection) bindingManager
// .getActiveBindingsDisregardingContext().get(trigger);
// ArrayList localConflicts = new ArrayList();
// if (matches != null) {
// localConflicts.add(newValue);
// Iterator i = matches.iterator();
// while (i.hasNext()) {
// Binding b = (Binding) i.next();
// if (binding != b
// && b.getContextId().equals(binding.getContextId())
// && b.getSchemeId().equals(binding.getSchemeId())) {
// Object element = bindingModel.getBindingToElement().get(b);
// if (element != null) {
// localConflicts.add(element);
// }
// }
// }
// }
//
// if (localConflicts.size() > 1) {
// // first find if it is already a conflict collection
// Collection knownConflicts = null;
// Iterator i = localConflicts.iterator();
// while (i.hasNext() && knownConflicts == null) {
// BindingElement tbe = (BindingElement) i.next();
// knownConflicts = (Collection) conflictsMap.get(tbe);
// }
// if (knownConflicts != null) {
// knownConflicts.add(newValue);
// conflictsMap.put(newValue, knownConflicts);
// newValue.setConflict(Boolean.TRUE);
// if (knownConflicts == conflicts) {
// controller.firePropertyChange(this, PROP_CONFLICTS_ADD,
// null, newValue);
// } else if (newValue == getSelectedElement()) {
// setConflicts(knownConflicts);
// }
// return;
// }
// boolean isSelected = false;
// i = localConflicts.iterator();
// while (i.hasNext()) {
// BindingElement tbe = (BindingElement) i.next();
// if (tbe != null) {
// conflictsMap.put(tbe, localConflicts);
// tbe.setConflict(Boolean.TRUE);
// }
// if (tbe == getSelectedElement()) {
// isSelected = true;
// }
// }
// if (isSelected) {
// setConflicts(localConflicts);
// }
// }
// }
//
// public void init(BindingManager manager, BindingModel model) {
// bindingManager = manager;
// bindingModel = model;
// conflictsMap = new HashMap();
// Iterator i = bindingModel.getBindings().iterator();
// while (i.hasNext()) {
// BindingElement be = (BindingElement) i.next();
// if (be.getModelObject() instanceof Binding) {
// updateConflictsFor(be);
// }
// }
// controller.addPropertyChangeListener(new IPropertyChangeListener() {
// public void propertyChange(PropertyChangeEvent event) {
// if (event.getSource() == ConflictModel.this
// && CommonModel.PROP_SELECTED_ELEMENT.equals(event
// .getProperty())) {
// if (event.getNewValue() != null) {
// updateConflictsFor(
// (BindingElement) event.getOldValue(),
// (BindingElement) event.getNewValue());
// setConflicts((Collection) conflictsMap.get(event
// .getNewValue()));
// } else {
// setConflicts(null);
// }
// } else if (BindingModel.PROP_BINDING_REMOVE.equals(event
// .getProperty())) {
// updateConflictsFor((BindingElement) event.getOldValue(),
// (BindingElement) event.getNewValue(), true);
// }
// }
// });
// }
//}